package py.una.pol.ii.is2.facade.flota;

import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import py.una.pol.ii.is2.dao.flota.TipoDAOLocal;
import py.una.pol.ii.is2.dao.flota.VehiculoCaracteristicaDAOLocal;
import py.una.pol.ii.is2.dao.flota.VehiculoDAO;
import py.una.pol.ii.is2.domain.flota.Caracteristica;
import py.una.pol.ii.is2.domain.flota.MarcaModelo;
import py.una.pol.ii.is2.domain.flota.Tipo;
import py.una.pol.ii.is2.domain.flota.Vehiculo;
import py.una.pol.ii.is2.domain.flota.VehiculoCaracteristica;
import py.una.pol.ii.is2.domain.flota.VehiculoCaracteristicaPK;

/**
 * Clase que implementa la interfaz VehiculoFacade
 * @author mbenitez
 * @date 30/04/2009
 */
@Stateless (mappedName="VehiculoFacade")
public class VehiculoFacadeBean implements VehiculoFacadeLocal, VehiculoFacadeRemote {

    @EJB
    private TipoDAOLocal tipoDao;
    private Tipo tipoVehiculo;
    @EJB
    private VehiculoDAO vehiculoDao;
    private Vehiculo vehiculo;
    @EJB
    private VehiculoCaracteristicaDAOLocal vehiculoCaracteristicaDao;
    private VehiculoCaracteristica vehiculoCaracteristica;

    /**
     * Inserta una entidad de Vehiculo en la base de datos.
     * @param codTipoVehiculo Identificador de tipo de vehículo
     * @param codModelo Identificador del modelo
     * @param codMarca Identificador de la marca
     * @param kilometraje Índice del kilometraje
     * @param nroChapa Número de chapa del vehículo
     * @param estado Estado del vehículo
     * @param ubicacion Ubicación actual del vehículo
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean insert(Integer codTipoVehiculo, Integer codModelo, Integer codMarca, Long kilometraje, String nroChapa, Integer estado, Integer ubicacion, String nroMovil) throws Exception {
        boolean retorno = false;
        try {
            vehiculo = new Vehiculo();
            vehiculo.setMarcaModelo(new MarcaModelo(codMarca, codModelo));
            vehiculo.setVehiEstado(estado);
            tipoVehiculo = tipoDao.find(codTipoVehiculo);
            vehiculo.setVehiCodTipo(tipoVehiculo);
            vehiculo.setVehiKilometraje(kilometraje);
            vehiculo.setVehiNroChapa(nroChapa);
            vehiculo.setVehiUbicacion(ubicacion);
            vehiculo.setVehiNroMovil(nroMovil);
            if (vehiculoDao.insert(vehiculo)) {
                copiarCaracteristicas();
            }
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }

    /**
     * Actualiza una entidad de Vehiculo, recibida como parámetro, en la base de datos.
     * @param codVehiculo Código de vehículo
     * @param codTipoVehiculo Código de tipo de vehículo
     * @param codModelo Código del modelo
     * @param codMarca Código de la marca
     * @param kilometraje Índice del kilometraje
     * @param nroChapa Número de chapa del vehículo
     * @param estado Estado del vehículo
     * @param ubicacion Ubicaicón del vehículo
     * @return true para señalar que la operación se ejecutó con éxito, en otro caso false.
     * @throws java.lang.Exception
     */
    public boolean update(Vehiculo codVehiculo, Integer codTipoVehiculo, Integer codModelo, Integer codMarca, Long kilometraje, String nroChapa, Integer estado, Integer ubicacion, String nroMovil) throws Exception {
        boolean retorno = false;
        try {
            vehiculo = codVehiculo;
            vehiculo.setMarcaModelo(new MarcaModelo(codMarca, codModelo));
            vehiculo.setVehiEstado(estado);
            tipoVehiculo = tipoDao.find(codTipoVehiculo);
            vehiculo.setVehiCodTipo(tipoVehiculo);
            vehiculo.setVehiKilometraje(kilometraje);
            vehiculo.setVehiNroChapa(nroChapa);
            vehiculo.setVehiUbicacion(ubicacion);
            vehiculo.setVehiNroMovil(nroMovil);
            if (vehiculoDao.update(vehiculo)) {
               //   copiarCaracteristicas();
            }
            retorno = true;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            return retorno;
        }
    }

    private void copiarCaracteristicas() throws Exception {
        // si tenemos poblada la tabla con relaciones al vehiculo, las eliminamos
        if (vehiculo.getVehiculoCaracteristicaCollection().size() > 0) {
            for (VehiculoCaracteristica vehiCara : vehiculo.getVehiculoCaracteristicaCollection()) {
                vehiculoCaracteristicaDao.delete(vehiCara);
            }
        }
        // se insertan las nuevas relaciones
        for (Caracteristica caracteristica : tipoVehiculo.getCaracteristicaCollection()) {
            vehiculoCaracteristica = new VehiculoCaracteristica(new VehiculoCaracteristicaPK(vehiculo.getVehiCod(), caracteristica.getCaraCod()));
            vehiculoCaracteristicaDao.insert(vehiculoCaracteristica);
        }
    }
    public List<Vehiculo> getListaVehiculo(String condicion) throws Exception {
        List<Vehiculo> retorno = null;
        try {
            // recuperamos la lista
            retorno = vehiculoDao.getListaVehiculos(condicion);
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }
}
